home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / srefv12i.zip / aliaschk.rxx < prev    next >
Text File  |  1996-12-14  |  6KB  |  271 lines

  1. /* Check aliases module for SRE-FILTER. Uses contents of aliasfile
  2. To call: set queue/sempahore with:
  3.  newqueue,newsem,OLDURL
  4. Returns
  5.  match , newurl
  6.  
  7. If match=0. then no match (and newurl=oldurl)
  8.  
  9. */
  10.  
  11. parse upper arg aliasfile,  usequeue , USESEM, max_semwait
  12. call pmprintf(' SRE-FILTER alias thread: aliasfile='||aliasfile)
  13. call pmprintf(' SRE-FILTER alias thread: queue='||usequeue)
  14. call pmprintf(' SRE-FILTER alias thread: semaphore='||usesem)
  15. mytid=dostid()
  16. call pmprintf(' SRE-FILTER alias thread: thread id='||mytid)
  17.  
  18.  
  19. resetit:
  20. if usequeue="" | USESEM="" then do
  21.    call pmprintf('SRE-FILTER alias thread: initialization ERROR: '||usequeue)
  22.    exit
  23. end
  24.  
  25. call set_alias(aliasfile)
  26.  
  27. /*
  28. call pmprintf(' aliases ')
  29. do mm=1 to naliases
  30.   call pmprintf(aliases.mm)
  31. end
  32. */
  33.  
  34. if naliases=0 then do
  35.    call pmprintf(' SRE-FILTER alias  thread: Warning: No valid entries in alias file:'||aliasfile)
  36. end
  37. else do
  38.    call pmprintf(' SRE-FILTER alias thread:  #aliases= '||naliases)
  39. end
  40.  
  41.  
  42. /* Initialization now done == start waiting for requests for alias info */
  43. signal on error name iserror
  44. signal on syntax name iserror
  45. bakme:
  46.  a=rxqueue('s',usequeue)
  47.  aq=queued()
  48.  if aq=0 then do
  49.     WOW=EVENTSEM_WAIT(USESEM,max_semwait)
  50.     aq=-1
  51.     if wow=640 then do
  52.          signal bakme
  53.     end
  54.  
  55.     IF WOW<>0 THEN do         /* FATAL ERROR */
  56.        call call pmprintf(' SRE-FILTER alias thread:  fatal semaphore error ')
  57.        exit
  58.     end
  59.  end
  60.  wow=EVENTSEM_RESET(usesem)
  61.  if aq=-1 then
  62.     if queued()=0 then    signal bakme
  63.  
  64.   PARSE pull isit0
  65.  
  66.   isit0=translate(isit0,' ','000d0a09'x)
  67.   if isit0="" then signal bakme
  68.  
  69. /* die command? */
  70.      if abbrev(isit0,'*DIE*')=1 then
  71.           exit
  72.  
  73.      parse var isit0  idnum ',' newq ',' newsem ',' ISIT
  74.      parse var idnum idnum host_nickname
  75.  
  76.      isitorig=isit
  77.      if newq="" | newsem=""  then do
  78.         call pmprintf(' SRE-FILTER alias thread: missing queue or semaphore ')
  79.         signal bakme
  80.      end
  81.      newq=upper(strip(newq)); newsem=upper(strip(newsem))
  82.      ISIT=STRIP(ISIT)
  83.  
  84.     if abbrev(isit,'*RESET*') then do
  85.        parse var isit foo newfile .
  86.           if newfile<>' ' then aliasfile=newfile
  87.           call set_alias(aliasfile)
  88.           call pmprintf(' SRE-Filter alias thread: Reread aliases file: 'aliasfile)
  89.     end
  90.     else do
  91.        if  naliases=0 then do
  92.            dog1=' 0 '||isitorig
  93.        end
  94.        else do
  95.           isit=translate(isit,'\','/')
  96.           isit=strip(isit,'l','\')
  97.           dog1=fig_alias(isit,host_nickname)
  98.       end
  99.  
  100.       a=rxqueue('s',newq)
  101.       push idnum ',' dog1
  102.       wow=eventsem_post(newsem)
  103.     end
  104.  
  105.  
  106. signal bakme
  107.  
  108. iserror:
  109. signal off error ; signal off syntax
  110. call pmprintf(' SRE-FIlter: error in alias thread ')
  111. a=rxqueue('d',usequeue)
  112. a=rxqueue('c',usequeue)
  113. a=eventsem_close(usesem)
  114. a=eventsem_create(usesem)
  115. a=rxqueue('s',newq)
  116. push idnum ', 0 '
  117. wow=eventsem_post(newsem)
  118. call pmprintf('SRE-FIlter: done resetting alias thread ')
  119. signal on error name iserror
  120. signal on syntax name iserror
  121. signal bakme
  122.  
  123.  
  124.  
  125. exit
  126.  
  127.  
  128.  
  129. /* ---------- */
  130. fig_alias:procedure expose aliases. aliashosts.
  131.  
  132.  
  133.   parse arg inline , host_nickname
  134.   host_nickname=strip(upper(host_nickname))
  135.   sel=translate(inline,' ','000d0a09'x)
  136.   doexact=0
  137.   gotit=0
  138.  
  139. starat=0 ; afterstar=0
  140. do m=1 to aliases.0               
  141.     if host_nickname<>aliashosts.m & aliashosts.m<>' ' then do
  142.          iterate
  143.      end
  144.  
  145.     jlias=aliases.m
  146.     parse var jlias jlias1 jlias2
  147.     ares=sref_wildcard(sel,jlias,doexact)
  148.     parse var ares astat "," aurl ;  astat=strip(astat)
  149.  
  150.     if astat=0 then iterate   /* no match */
  151.     aurl=strip(aurl)
  152.     if aurl="" then do
  153.           usesel0=sel
  154.     end
  155.     else do
  156.           usesel0=aurl
  157.     end
  158.     if astat=1 then do
  159.        usesel=usesel0
  160.        gotit=m
  161.        leave           /*first exact match rules */
  162.     end
  163.     else do                     /* best match rules */
  164.        t1=pos('*',jlias1)
  165.        t33=length(jlias1)-t1
  166.        if t1 >= starat  then do
  167.           if t1 > starat | t33>afterstar then do
  168.              starat=t1 ; afterstar=t33
  169.              gotit=m
  170.              usesel=usesel0
  171.           end
  172.        end
  173.     end
  174. end
  175.  
  176. if gotit=0 then
  177.    usesel=inline
  178.  
  179. /* fix up / */
  180.  parse var usesel k1 '?' k2
  181.  k1=translate(k1,'/','\')
  182.  if pos('?',usesel)>0 then
  183.         usesel=k1||'?'||k2
  184.    else
  185.        usesel=k1
  186.  return gotit ' ' usesel
  187.  
  188.  
  189.  
  190. /* ---------------- */
  191. /* read and set up aliases */
  192. set_alias: 
  193. parse arg afile
  194.  
  195. naliases=0
  196. aliases.0=0
  197.  
  198. a=fileread(afile,'ulines',,'E')   /* read it to a stem variable */
  199. foo=do_extends(1)
  200.  
  201. oo=stream(afile,'c','close')
  202. if a=0 then do
  203.       call pmprintf(' SRE-FILTER alias thread: ERROR reading user-file: '||afile)
  204.       return
  205. end
  206.  
  207. exton=0
  208. do mm=1 to ulines.0
  209.   t1=strip(ulines.mm)
  210.  
  211.   if exton=1 then do
  212.        t1=t1storage||t1
  213.   end
  214.   exton=0 
  215.  
  216.   if t1="" then iterate
  217.   if abbrev(t1,';')=1 then iterate
  218.  
  219.   if right(t1,2)=' ,' & mm < ulines.0 then do
  220.         exton=1
  221.         t1=left(t1,length(t1)-2)
  222.         t1storage=strip(t1)
  223.         iterate
  224.   end
  225.  
  226.   tm1=strip(word(t1,1)) ; ahost=' '
  227.   if right(tm1,2)='//' then do
  228.         ahost=upper(left(tm1,length(tm1)-2))
  229.         parse var t1 foo t1a t1b
  230.   end
  231.   else
  232.       parse var t1 t1a t1b
  233.  
  234.   t1a=translate(t1a);
  235.   t1a=translate(t1a,'\','/')
  236.   t1a=strip(t1a,'l','\')
  237.   naliases=naliases+1
  238.   aliases.naliases=upper(t1a)||'  '||t1b
  239.   aliashosts.naliases=ahost
  240. end
  241. aliases.0=naliases
  242.  
  243. return 0
  244.  
  245.  
  246.  
  247. /************/
  248. /* Redo ulines, by treating lines starting with , as continuation lines */
  249. do_extends:procedure expose ulines.
  250.  
  251. if ulines.0=0 then return
  252. isnew=1
  253. tmps.1=ulines.1
  254. do mm=2 to ulines.0
  255.    ali=strip(ulines.mm)
  256.    if abbrev(ali,',')=0 then do
  257.         isnew=isnew+1
  258.         tmps.isnew=ulines.mm
  259.     end
  260.     else do
  261.         tmps.isnew=tmps.isnew||substr(ali,2)
  262.     end
  263. end
  264. do mm=1 to isnew
  265.     ulines.mm=tmps.mm
  266. end
  267. ulines.0=isnew
  268. return 0
  269.  
  270.  
  271.